Software testing is a fundamental component of software quality assurance and includes many methodologies and types, such as acceptance testing, black box testing, compatibility testing, functional testing, integration testing, regression testing, system testing, unit testing, and white box testing. It is common for software developers to spend a significant amount of time and effort on generating the tests, and to spend a significant amount of time and effort on maintaining the available tests.
Common testing methodologies, such as manual testing and record and play testing, require the test setup to be almost the same as the original setup, which is an unrealistic requirement in many cases. This is especially noticeable when facing a system upgrade, where all the standard components are upgraded without additional developments or modules. The effect of the system upgrade on the user code is unknown and thus should be tested.